package com.zt.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect//注册切面
public class ContractAOP {
	/**
	 * execute(* com.zt.aop.*.*(..))
	 * 第一个*代表任意安全级别任意返回值
	 * 第二个*代表任意实现类
	 * 第三个*代表任意方法
	 * 第三个*后面括号内的点代表任意参数列表
	 */
	//声明切点
	@Pointcut("execution(* com.zt.dao.ContractDao.*(..))")
	public void executeAspect(){}
	
	//前置通知
	@Before("executeAspect()")
	public void before(JoinPoint joinPoint) {
		//获取方法名
		String methodName=joinPoint.getSignature().getName();
		//获取参数
		Object[] objs=joinPoint.getArgs();
		System.out.println(methodName+"方法开始执行了，参数是："+objs);
	}
	
	//后置日志:不管程序是否出现异常都会执行
	@After("executeAspect()")
	public void after(JoinPoint joinPoint){
		//获取方法名
		String methodName=joinPoint.getSignature().getName();
		//获取参数
		Object[] objs = joinPoint.getArgs();
		System.out.println(methodName+"方法执行完毕，参数是："+objs);
	}
	
	//返回值日志：用来获取返回值
	@AfterReturning(value="executeAspect()",returning="result")
	public void afterRunning(JoinPoint joinPoint,Object result){
		//获取方法名
		String methodName=joinPoint.getSignature().getName();
		System.out.println(methodName+"方法执行完毕后的返回值是："+result);
	}
	
	//异常通知：当程序发生异常的时候所处理的逻辑
	@AfterThrowing(value="executeAspect()",throwing="e")
	public void afterThrowing(JoinPoint joinPoint,Exception e){
		//获取方法名
		String methodName=joinPoint.getSignature().getName();
		System.err.println(methodName+"方法执行出现异常，错误信息为："+e);
	}
}
